<?php

	//klasa obslugujaca polaczeia ftp

	class CFtp
	{
		var $m_hFtp;	//handler do poalczenia ftp'owego

		static function &GetInstance()
		{
			global $g_hObjects;
			static $m_hApp = NULL;
						 
			if(!isset($m_hApp))
			{
				$m_hApp = new CFtp();
				$g_hObjects[] = $m_hApp;
				$m_hApp->OnInit();			
			}
	    
		 return $m_hApp;
		}
	
		function OnInit()
		{
			$this->m_hFtp = '';
		}
	
		function OnDestroy()
		{
			if($this->m_hFtp)
				ftp_close($this->m_hFtp);
		}
		
		//wykonuje polaczenie do serwera ftp
		//
		// $szHost - ip/nazwa serwera ftp
		// $iPort  - port ftp (dmyslnie 21)
		// $iTmOut - max. czas oczekiwania na polaczenie

		function Connect($szHost,$iPort = '21',$iTmOut = '10')
		{
			$this->m_hFtp = @ftp_connect($szHost,$iPort,$iTmOut);

			if(!$this->m_hFtp) 
			{ 
				return false; 
			}

			@ftp_pasv($this->m_hFtp,true);

			return true;

		}
		
		//loguje sie do serwera ftp
		//
		// $szUser - uzytkownik
		// $szPass - haslo

		function Login($szUser,$szPass)
		{
			return @ftp_login($this->m_hFtp,$szUser,$szPass) ? true : false;
		}

		//pobiera zawartosc katalogu
		//
		// $szPath - sciezka do katalogu
		// domyslnie pobieramy
		function GetDir($szPath = '.')
		{
			$aTemp  =  @ftp_rawlist($this->m_hFtp,$szPath);
			$aFiles =  array();
			
			if($aTemp == false) { return $aFiles; }

			
			foreach($aTemp as $szTmp)
			{
				$aInfo = preg_split("/[\s]+/",$szTmp,9);
				
				if($aInfo[8] == '.' || $aInfo[8] == '..')
					continue;


				$bIsDir = (stripos($aInfo[0],'d') === false ) ? false : true;

		
				$aFiles[] = array('name' => $aInfo[8],
								  'size' => CFtp::FormatSize($aInfo[4]),
								  'time' => $aInfo[7],
								  'date' => date("d-m",strtotime($aInfo[6].' '.$aInfo[5])),
								  'dir'  => $bIsDir );
					
			}

			return $aFiles;
		}

		static function FormatSize($iSize)
		{
			if($iSize <= 0) { return; }	

			if ($iSize < 1024)
			{
				return round($iSize,2).' b';
			}
			elseif ($iSize < (1024*1024))
			{
				return round(($iSize/1024),2).' KB';
			}
			elseif ($iSize < (1024*1024*1024))
			{
				return round((($iSize/1024)/1024),2).' MB';
			}
			elseif ($iSize < (1024*1024*1024*1024))
			{
				return round(((($iSize/1024)/1024)/1024),2).' GB';
			}

		}
		
		//zwraca biezacy katalog ftp
		function GetCurrDir()
		{
			return ftp_pwd($this->m_hFtp);
		}

		
		//wrzuca plik via ftp na docelowy serwer
		//
		// $szLocalPath - sciezka na lokalnej maszynie gdzie dziala php
		// $szFtpPath   - sciezka na docelowej maszynie gdzie dziala ftp
		function UploadFile($szLocalPath,$szFtpPath)
		{
			$hLocalFile = fopen($szLocalPath,'r');

			if(!$hLocalFile) { return false; }

			ftp_fput($this->m_hFtp,$szFtpPath,$hLocalFile,FTP_BINARY);
		}
		
		//pobier aplik z ftp
		//
		// $szLocalPath - lokalna sciezka do pliku
		// $szFtpPath	- sciezka pliku na maszynie gdzie dziala ftp
		
		function DownloadFile($szLocalPath,$szFtpPath)
		{
			$hLocalFile = fopen($szLocalPath,'w+');

			if(!hLocalFile) { return false; }

			return ftp_fget($this->m_hFtp,$hLocalFile,$szFtpPath,FTP_BINARY);
		}

		//kasuje zadany plik
		function DeleteFile($szPath)
		{
			return ftp_delete($this->m_hFtp,$szPath);
		}
		
		//kasuj zadany katalog
		function DeleteDir($szPath)
		{
			ftp_rmdir($this->m_hFtp,$szPath);
		}
		
		//zmienia katalog
		function ChangeDir($szPath)
		{
			if($szPath == '.' || $szPath == '..')
			{
				ftp_cdup($this->m_hFtp);
				return;
			}

			 ftp_chdir($this->m_hFtp,$szPath);
		}

		//tworzy katalog
		function MakeDir($szPath)
		{
			ftp_mkdir($this->m_hFtp,$szPath);
		}
		
	}	

?>